/***************STM32F103RCT6**********************
 * 文件名  ：uart.c
 * 描述    ：
 * 备注    : 
 * 接口    ：PA9
			 PA10


********************LIGEN*************************/
//-------------------------include C Header File start------------------------//
#include "usart.h"
//-------------------------include C Header File end--------------------------//
//-------------------------defined variable start-----------------------------//
UART_HandleTypeDef UART1_Handler;
//-------------------------defined variable end-------------------------------//
#if 1//串口输出重写可使用printf
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
int fgetc(FILE *f)
{

    int ch;
    HAL_UART_Receive(&UART1_Handler, (uint8_t *)&ch, 1, 1000);
    return (ch);
}
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#else
int fgetc(FILE *f)
{

    int ch;
    HAL_UART_Receive(&UART1_Handler, (uint8_t *)&ch, 1, 1000);
    return (ch);
}
int fputc(int ch, FILE *f)
{
    /* 发送一个字节数据到串口RS232_USART */
    HAL_UART_Transmit(&UART1_Handler, (uint8_t *)&ch, 1, 1000);

    return (ch);
}
#endif 
/*******************************************************************************
** 函数名称: MX_USART1_Init
** 功能描述: USART1配置初始化
** 参数说明: None
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-05-31
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void MX_USART1_Init(void)
{
  UART1_Handler.Instance = USART1;
  UART1_Handler.Init.BaudRate = 115200;//波特率
  UART1_Handler.Init.WordLength = UART_WORDLENGTH_8B;//字长为8位数据格式
  UART1_Handler.Init.StopBits = UART_STOPBITS_1;//一个停止位
  UART1_Handler.Init.Parity = UART_PARITY_NONE;//无奇偶校验位
  UART1_Handler.Init.Mode = UART_MODE_TX_RX;//收发模式
  UART1_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;//无硬件流控
  UART1_Handler.Init.OverSampling = UART_OVERSAMPLING_16;//高速过采样
  if (HAL_UART_Init(&UART1_Handler) != HAL_OK)
  {
    Error_Handler();
  }
}
/*******************************************************************************
** 函数名称: HAL_UART_MspInit
** 功能描述: uart1管脚配置和dma1管脚配置初始化
** 参数说明: uartHandle: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-05-31
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(uartHandle->Instance==USART1)
    {
        /* USART1 clock enable */
        __HAL_RCC_USART1_CLK_ENABLE();
        __HAL_RCC_DMA1_CLK_ENABLE();  
        __HAL_RCC_GPIOA_CLK_ENABLE();
        /**USART1 GPIO Configuration    
        PA9     ------> USART1_TX
        PA10     ------> USART1_RX 
        */
        GPIO_InitStruct.Pin = USART1_TX_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
        HAL_GPIO_Init(USART1_TX_GPIO_Port, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = USART1_RX_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(USART1_RX_GPIO_Port, &GPIO_InitStruct);

    }
}
/*******************************************************************************
** 函数名称: HAL_UART_MspDeInit
** 功能描述: 
** 参数说明: uartHandle: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-05-31
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

  if(uartHandle->Instance==USART1)
  {
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();
  
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    HAL_GPIO_DeInit(GPIOA, USART1_TX_Pin|USART1_RX_Pin);

    /* USART1 DMA DeInit */
    HAL_DMA_DeInit(uartHandle->hdmatx);

    /* USART1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  }
} 
/*******************************************************************************
** 函数名称: Uart_Receive_Interrupt_Switch
** 功能描述: 串口接收开关
** 参数说明: huart: [输入/出]
**			 uart_receive_data: [输入/出]
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-01
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
u8 Uart_Receive_Interrupt_Switch ( UART_HandleTypeDef* huart,uint8_t* uart_receive_data )
{
	u8 statu ;
	__HAL_UNLOCK ( huart );
	statu =  HAL_UART_Receive_IT ( huart,uart_receive_data,1 );
	return statu;
}
//-------------------------defined variable start-----------------------------//
u8 Uart1_rdata=0;
u8 uart1_rxbuff[UART1_RX_BUFF_LEN]={0};
bool uart1_Receive_Right_flag=false;
//-------------------------defined variable end-------------------------------//
/*******************************************************************************
** 函数名称: HAL_UART_RxCpltCallback
** 功能描述: 串口接收中断回调函数
** 参数说明: huart: [输入/出]
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-01
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void HAL_UART_RxCpltCallback ( UART_HandleTypeDef* huart ) //串口中断回调函数
{
	static uint8_t Uart1_reData_flag=0;
	static uint8_t Uart1_reData_len=0;
    
	if ( huart->Instance == UART1_Handler.Instance ) // 调试打印串口
	{
		if((Uart1_rdata == 'S') && (Uart1_reData_flag==0))
		{
			Uart1_reData_flag=1;

		}
		if(Uart1_reData_flag)
		{
			uart1_rxbuff[Uart1_reData_len]=Uart1_rdata;
			if(uart1_rxbuff[Uart1_reData_len] != '!')
			{
				Uart1_reData_len++;
			}
			else
			{
				if(uart1_rxbuff[0] == 'S')
				{
					uart1_Receive_Right_flag=true;
				}
				else
				{
					memset ( uart1_rxbuff,0,sizeof(uart1_rxbuff));
				}
				Uart1_reData_flag=0;
				Uart1_reData_len=0;
			}
		}
		Uart_Receive_Interrupt_Switch(&UART1_Handler,&Uart1_rdata);
	}
}
/*******************************************************************************
** 函数名称: PrintBytes1
** 功能描述: 调试串口发送字节
** 参数说明: puts: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-08-14
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void PrintBytes1(uint8_t puts)
{
    __HAL_UNLOCK ( &UART1_Handler );
	HAL_UART_Transmit(&UART1_Handler,&puts,1,1000);
}
/*******************************************************************************
** 函数名称: PrintString6
** 功能描述: 调试串口发送字符串
** 参数说明: puts: [输入/出] 
**			 LEN: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-08-14
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void PrintString1(u8 *puts,u8 LEN)
{
    u8 put[1];
	u8 len=0;
	for(;len<LEN;puts++,len++)
	{
		put[0]=*puts;
        __HAL_UNLOCK ( &UART1_Handler );
		HAL_UART_Transmit(&UART1_Handler,put,sizeof(put),1000);
	}
}

/*********************************END OF FILE***********************************/

